package recomendadorWeb;

import recomendadorWeb.Traza.TipoTraza;
import testTemp.Temperamento;

public class RecomendadorTT implements RecomendadorWeb{
	
	private TablaGeneroTemperamento3 tabla;
	private Usuario u;
	
	@Override
	public void inicia(Usuario u) {
		ArrTrazas.arrTrazas.add(new Traza(TipoTraza.COMENTARIO,"",7,"RecomendadorTT", "inicia(Usuario u)", 
		"iniciamos el RecomendadorTT"));		
		ArrTrazas.arrTrazas.add(new Traza(TipoTraza.COMENTARIO,"",7,"RecomendadorTT", "inicia(Usuario u)", 
		"Creamos una tabla de tipo TablaGeneroTemperamento3"));
		
		tabla=new TablaGeneroTemperamento3();
		this.u=u;
	}
	
	@Override
	public String descripcion(){
		return "RT";
	}
	
	@Override
	public double getPuntuacion(PeliGeneros p){
		double art=0;
		double ide=0;
		double gua=0;
		double rac=0;
		
		ArrTrazas.arrTrazas.add(new Traza(TipoTraza.COMENTARIO,"",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")", "art,ide,gua,rac=0"));
		
		int numGen=p.getCantidadGeneros();
		Generos g;
		
		ArrTrazas.arrTrazas.add(new Traza(TipoTraza.CALCULO,"",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")",
		"art=art+p.getCantidadGenero(g)*tabla.getValorTabla(g, Temperamento.Artesano);"));
		
		ArrTrazas.arrTrazas.add(new Traza(TipoTraza.CALCULO,"",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")",
		"ide=ide+p.getCantidadGenero(g)*tabla.getValorTabla(g, Temperamento.Idealista);"));
		
		
		ArrTrazas.arrTrazas.add(new Traza(TipoTraza.CALCULO,"",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")",
		"gua=gua+p.getCantidadGenero(g)*tabla.getValorTabla(g, Temperamento.Guardian);"));
				
		ArrTrazas.arrTrazas.add(new Traza(TipoTraza.CALCULO,"",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")",
		"rac=rac+p.getCantidadGenero(g)*tabla.getValorTabla(g, Temperamento.Racional);"));
		
		for (int i=0; i<numGen; i++){
			g=p.getGenero(i);
			art=art+p.getCantidadGenero(g)*tabla.getValorTabla(g, Temperamento.Artesano);
			ide=ide+p.getCantidadGenero(g)*tabla.getValorTabla(g, Temperamento.Idealista);
			gua=gua+p.getCantidadGenero(g)*tabla.getValorTabla(g, Temperamento.Guardian);
			rac=rac+p.getCantidadGenero(g)*tabla.getValorTabla(g, Temperamento.Racional);
			
			ArrTrazas.arrTrazas.add(new Traza(TipoTraza.CALCULO,"",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")",
			"art("+g+")= "+art));
			ArrTrazas.arrTrazas.add(new Traza(TipoTraza.CALCULO,"",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")",
			"ide("+g+")= "+ide));
			ArrTrazas.arrTrazas.add(new Traza(TipoTraza.CALCULO,"",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")",
			"gua("+g+")= "+gua));
			ArrTrazas.arrTrazas.add(new Traza(TipoTraza.CALCULO,"",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")",
			"rac("+g+")= "+rac));
		}
		double sumaTotal= art+ide+gua+rac;
		if (sumaTotal!=0){
			art=art/sumaTotal;
			ide=ide/sumaTotal;
			gua=gua/sumaTotal;
			rac=rac/sumaTotal;
			
			ArrTrazas.arrTrazas.add(new Traza(TipoTraza.VARIABLE,"art",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")",
			"art("+p.getTitulo()+") = art/sumaTotal = "+art));
			ArrTrazasVars.arrTrazasVars.add(new TrazaVars(6,ArrTrazas.arrTrazas.size(),"art("+p.getTitulo()+")",1,art, IO.OUT));
			
			ArrTrazas.arrTrazas.add(new Traza(TipoTraza.VARIABLE,"ide",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")",
			"ide("+p.getTitulo()+") = ide/sumaTotal = "+ide));
			ArrTrazasVars.arrTrazasVars.add(new TrazaVars(6,ArrTrazas.arrTrazas.size(),"ide("+p.getTitulo()+")",1,ide, IO.OUT));
			
			ArrTrazas.arrTrazas.add(new Traza(TipoTraza.VARIABLE,"gua",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")",
			"gua("+p.getTitulo()+") = gua/sumaTotal = "+gua));
			ArrTrazasVars.arrTrazasVars.add(new TrazaVars(6,ArrTrazas.arrTrazas.size(),"gua("+p.getTitulo()+")",1,gua, IO.OUT));
			
			ArrTrazas.arrTrazas.add(new Traza(TipoTraza.VARIABLE,"rac",6,"RecomendadorTT", "getPuntuacion("+p.getTitulo()+")",
			"rac("+p.getTitulo()+") = rac/sumaTotal = "+rac));
			ArrTrazasVars.arrTrazasVars.add(new TrazaVars(6,ArrTrazas.arrTrazas.size(),"rac("+p.getTitulo()+")",1,rac, IO.OUT));
			
			return calculoTT(u, art, ide, gua, rac, p);
			}
		else return 0;
	}

	private double calculoTT(Usuario u, double art, double ide, double gua,
			double rac, PeliGeneros p) {
		ArrTrazas.arrTrazas.add(new Traza(TipoTraza.CALCULO,"",7,"RecomendadorTT", "calculoTT(Usuario u,TempUsuario)", 
		"puntuacion=|u.getPorcentajeArtesano()/100-art)| + "+
		"|u.getPorcentajeIdealista()/100-ide| + "+
		"|u.getPorcentajeGuardian()/100-gua| + "+
		"|u.getPorcentajeRacional()/100-rac|"));
		
		double puntuacion=0;
		double punt=0;
		puntuacion=puntuacion+Math.abs(u.getPorcentajeArtesano()/100-art);
		puntuacion=puntuacion+Math.abs(u.getPorcentajeIdealista()/100-ide);
		puntuacion=puntuacion+Math.abs(u.getPorcentajeGuardian()/100-gua);
		puntuacion=puntuacion+Math.abs(u.getPorcentajeRacional()/100-rac);
		
		ArrTrazas.arrTrazas.add(new Traza(TipoTraza.VARIABLE,"puntuacion",7,"RecomendadorTT", "calculoTT(Usuario u,TempUsuario)",
		"puntuacion("+p.getTitulo()+") = "+puntuacion));
				
		punt=1 - (puntuacion/4);
		
		ArrTrazas.arrTrazas.add(new Traza(TipoTraza.VARIABLE,"puntRT("+p.getTitulo()+")",7,"RecomendadorTT", "calculoTT(Usuario u,TempUsuario)",
		"punt("+p.getTitulo()+") = 1 - (puntuacion/4) = "+punt+"<br/>"));
		ArrTrazasVars.arrTrazasVars.add(new TrazaVars(7,ArrTrazas.arrTrazas.size(),"puntRT("+p.getTitulo()+")",1,punt, IO.OUT));
		
		return punt;
	}

	@Override
	public double getPuntuacionAnimo(PeliGeneros p, EstadosAnimo e) {
		double puntuacion = 0;
		double limite = 25;
		switch (e) {
		case Alegre:
			if (p.getCantidadGenero(Generos.Comedia) > limite)
				puntuacion = getPuntuacion(p);
			break;
		case Triste:
			if (p.getCantidadGenero(Generos.Drama) > limite)
				puntuacion = getPuntuacion(p);
			break;
		case Sorprendido:
			if (p.getCantidadGenero(Generos.Accion)>limite || p.getCantidadGenero(Generos.Aventuras)>limite){
				puntuacion = getPuntuacion(p);
			}
			break;
		case Asustado:
			if ((p.getCantidadGenero(Generos.Terror)>limite || p.getCantidadGenero(Generos.Thriller)>limite) && p.getCantidadGenero(Generos.Animacion)<limite){
				puntuacion = getPuntuacion(p);
			}
			break;
		case Relajado:
			if (p.getCantidadGenero(Generos.Documental)>limite || p.getCantidadGenero(Generos.Romantica)>limite){
				puntuacion = getPuntuacion(p);
			}
			break;

		}
		return puntuacion;
	}
}
